/* cl.ext.select2 0.1*/
(
    function (factory) {
        if (typeof define === 'function' && define.amd) {
            define(['jquery',"Select2"], factory);
        } else if (typeof module === 'object' && module.exports) {
            var select2 = require('Select2');
            module.exports = function( root, jQuery ) {
                if ( jQuery === undefined ) {
                    if ( typeof window !== 'undefined' ) {
                        jQuery = require('jquery');
                    }
                    else {
                        jQuery = require('jquery')(root);
                    }
                }
                factory(jQuery);
            };
        } else {
            factory(jQuery);
        }
    }(
    function ($){
        var defaultExtInfo={
            isStartBind:true,dataSource:"json",initIndex:-1,initValue:"",
            data:[],ajax:{dataMode:"all",url:"",data:{}},
            direction:"auto",//auto|up|down
            defaultValue:{},
            beforeCallback:null,
            initCallback:null,
            changeCallback:null,
            clickCallback:null
        };
        var defaults={placeholder: "-请选择-",language: "zh-CN",theme: "bootstrap",minimumResultsForSearch:Infinity,infoExt:defaultExtInfo};
        var $modalCommon={
            getDefaults :function () {
                return defaults
            },
            getOptions : function (elementData,options) {
                if(!$.ExtCommon.isCheckEmpty(elementData)&&!$.ExtCommon.isCheckEmpty(elementData.initValue)){elementData.infoExt={initValue:elementData.initValue.toString()};}
                options=$.ExtCommon.isCheckEmpty(options)?{}:options;
                var optionBase =$.ExtCommon.initMergeJson(elementData,options);
                optionBase =$.ExtCommon.initMergeJson(this.getDefaults(),optionBase);
                if($.ExtCommon.isCheckUndefined(optionBase.infoExt.initValue) && !$.ExtCommon.isCheckEmpty(optionBase.initValue)){optionBase.infoExt.initValue=optionBase.initValue}
                if($.ExtCommon.isCheckEmpty(optionBase.infoExt.dataSource)&& !$.ExtCommon.isCheckEmpty(optionBase.infoExt.ajax.url)) optionBase.infoExt.dataSource="ajaxjson";
                var tempInfo=optionBase.infoExt;
                if(tempInfo.dataSource==="ajaxpage"){
                    var tempAjaxJson={
                        url: tempInfo.ajax.url,
                        dataType: 'json',
                        type: "GET",
                        delay: 250,
                        cache: true
                    };
                    switch(tempInfo.ajax.dataMode){
                        case "page":
                            tempAjaxJson.data=function(params) {
                                return {
                                    search_Keyword: params.term,
                                    start: params.start,
                                    length: params.length
                                }
                            };
                            tempAjaxJson.processResults=function(params) {
                                var dataJson={};
                                var arr=[];
                                for(var i=0;i<data.length;i++){
                                    arr.push({id:data[i].id,text:data[i].name})
                                }
                                params.start = params.start || 0;
                                params.length = params.length || 30;
                                dataJson.list=arr;
                                dataJson.recordsTotal= data.recordsTotal||0;
                                return {
                                    results: dataJson.list,
                                    pagination: {
                                        more: (params.start+params.length) < data.recordsTotal
                                    }
                                };
                            };
                            break;
                        case "allpage":
                            tempAjaxJson.data=function(params) {
                                return {
                                    search_keyword: params.term
                                }
                            };
                            tempAjaxJson.processResults=function(params) {
                                var arr=[];
                                for(var i=0;i<data.length;i++){
                                    arr.push({id:data[i].id,text:data[i].name})
                                }
                                return {
                                    results: arr,
                                    pagination: {
                                        more:false
                                    }
                                };
                            };
                            break;
                    }
                    optionBase.ajax=tempAjaxJson;
                    optionBase.minimumInputLength=0;
                }else if(tempInfo.dataSource==="ajaxjson"){
                }else{
                    if(!$.ExtCommon.isCheckEmpty(tempInfo.data)){
                        optionBase.data=tempInfo.data;
                    }
                }
                return optionBase
            }
        };
        var Select2ExtModal = function(element, options) {
            var self=this;
            self.element = $(element);
            self.optionBase=$modalCommon.getOptions(self.element.data(),options);
            self.optionBase.data=[];
            if(!$.ExtCommon.isCheckEmpty(self.optionBase.infoExt.ajax.url)){
                var url=self.optionBase.infoExt.ajax.url;
                var para=self.optionBase.infoExt.ajax.data;
                para= $.ExtCommon.isCheckEmpty(para)?{}:para;
                $.ExtAjax.initGet({url:url,data:para,
                    successCallback:function(res){
                        var list=res.success?$.ExtCommon.convertListByPara(res.data):[];
                        if(!res.success){ $.ExtNotify.error(res.msg);}
                        self.optionBase.OriginalData=res.data;
                        self.optionBase.data=list;
                        if(self.optionBase.infoExt.beforeCallback){
                            var templist=self.optionBase.infoExt.beforeCallback(list,res.data);
                            self.optionBase.data= $.ExtCommon.isCheckEmpty(templist)?[]:templist;
                        }
                        self.bind();
                    }
                });
            }else{
                if(!$.ExtCommon.isCheckEmpty(self.optionBase.infoExt.data)){
                    self.optionBase.data=self.optionBase.infoExt.data[0].hasOwnProperty("text")
                        ?$.ExtCommon.getListClone(self.optionBase.infoExt.data)
                        :$.ExtCommon.convertListByPara(self.optionBase.infoExt.data);
                    //self.optionBase.data=$.ExtCommon.convertListByPara(self.optionBase.infoExt.data);
                }
                self.bind();
            }
        };
        Select2ExtModal.prototype = {
            bind:function(data){
                var self=this;
                if(data)self.optionBase.data=data;
                var defaultValue=self.optionBase.infoExt.defaultValue;
                if(!$.ExtCommon.isCheckEmpty(defaultValue) && !$.ExtCommon.isCheckEmpty(self.optionBase.data)){self.optionBase.data.unshift(defaultValue);}
                self.element.select2(self.optionBase);
                self.initStartChange=false;
                self.initStartClear=true;
                var initValue=self.getInitValue(self.optionBase.infoExt.initValue);

                if(self.optionBase.infoExt.initCallback){
                    setTimeout(function(){
                        self.optionBase.infoExt.initCallback(self.optionBase.data,initValue,self.optionBase.OriginalData);
                    },100)
                }
                if($.ExtCommon.isCheckEmpty(self.optionBase.multiple)){
                    self.element.on('change',function () {
                        if(self.initStartChange){
                            var _this=$(this);
                            var value=_this.val();
                            var info= $.ExtCommon.isCheckEmpty(value)?{}:$.map(self.optionBase.data,function(info){if(info.id.toString()===value){return info}})[0];
                            if($.ExtCommon.isCheckEmpty(value)){
                                if(self.optionBase.allowClear &&  self.initStartClear){self.element.select2("open")}
                                self._clearTitle();
                            }
                            if(self.optionBase.infoExt.changeCallback){
                                self.optionBase.infoExt.changeCallback(value,_this,info);
                            }
                        }
                        self.initStartClear=true;
                    });
                }
                self.element.next(".select2.select2-container").find(".select2-selection.select2-selection--single").on('click',function () {
                    if(self.optionBase.infoExt.clickCallback && $(this).attr("aria-expanded")==="true"){
                        self.optionBase.infoExt.clickCallback(self.optionBase.data)
                    }
                });
                self._clearTitle();
                self.init(initValue);
            },
            _clearTitle:function(){
                this.element.next().find(".select2-selection__rendered").attr("title","");
            },
            getInitValue: function (value) {
                var self=this;
                value=$.ExtCommon.isCheckEmpty(value)?"":value;
                if(self.optionBase.infoExt.initIndex>-1 && value.length===0 && self.optionBase.data && self.optionBase.data.length>0){
                    var ind=$.ExtCommon.isCheckEmpty(self.optionBase.infoExt.defaultValue)?self.optionBase.infoExt.initIndex:self.optionBase.infoExt.initIndex+1;
                    value=self.optionBase.data[ind].id
                }
                return value.toString();
            },
            init:function(value,isChange){
                var self=this;
                value=self.getInitValue(value);
                if(!$.ExtCommon.isCheckEmpty(isChange)){ self.initStartChange=isChange;}
                self._changeValue(this.getInitValue(value));
            },
            _changeValue:function(value){
                var self=this;
                if($.ExtCommon.isCheckEmpty(value) && self.initStartChange){self.initStartClear=false}
                self.element.val(value).trigger("change");
                self.initStartChange=true;
            },
            replaceData:function(data,value,isChange){
                var self=this;
                var tempData= $.ExtCommon.isCheckEmpty(data)?[]:$.ExtCommon.convertListByPara(data);
                var isDefaultValue=$.ExtCommon.isCheckEmpty(self.optionBase.infoExt.defaultValue);
                if(!isDefaultValue && tempData.length>0 && tempData[0].id!=self.optionBase.infoExt.defaultValue.id){tempData.unshift(self.optionBase.infoExt.defaultValue);}
                var strOption=$.map(tempData,function(item){return '<option value="'+item.id+'">'+item.text+'</option>';});
                self.optionBase.data=tempData;
                self.element.html(strOption);
                if($.type(value)==="number"){
                    value=value==-1?-1:(isDefaultValue?value:value+1);
                    value=tempData[value]?tempData[value].id:"";
                }else{
                    value=$.ExtCommon.isCheckEmpty(value)?(tempData.length==0?"":tempData[0].id):value;
                }
                if(!$.ExtCommon.isCheckEmpty(isChange)){ self.initStartChange=isChange;}
                self._changeValue(value);
            },
            getValue:function(){
                return this.element.val();
            },
            getValueInfo:function(){
                var value=this.element.val();
                return $.ExtCommon.isCheckEmpty(value)
                    ?{}:
                    $.map(this.optionBase.data,function(info){if(info.id.toString()==value){return info}})[0];
            },
            disabled:function(){
                this.element.prop("disabled",true);
            },
            removeDisabled:function(){
                this.element.prop("disabled",false);
            }
        };
        $.fn.ExtSelect2 = function(options) {
            var dataFun;
            this.each(function() {
                var el = $(this);
                var tempData=el.data('ExtSelect2');
                if (tempData) {
                    if (typeof options === "string") {
                        if (tempData[options]) {
                            dataFun =tempData[options]()
                        } else {
                            dataFun = tempData
                        }
                    } else {
                        dataFun = tempData
                    }
                } else {
                    dataFun = new Select2ExtModal(el, options);
                    el.data('ExtSelect2', dataFun);
                }
            });
            return dataFun;
        };
        (function($){
            var e = $.fn.select2.amd;
            return e.define("select2/i18n/zh-CN", [], function() {
                return {
                    errorLoading: function() {
                        return "无法载入结果。"
                    },
                    inputTooLong: function(e) {
                        var t = e.input.length - e.maximum
                            , n = "请删除" + t + "个字符";
                        return n
                    },
                    inputTooShort: function(e) {
                        var t = e.minimum - e.input.length
                            , n = "请再输入至少" + t + "个字符";
                        return n
                    },
                    loadingMore: function() {
                        return "载入更多结果…"
                    },
                    maximumSelected: function(e) {
                        var t = "最多只能选择" + e.maximum + "个项目";
                        return t
                    },
                    noResults: function() {
                        return "未找到结果"
                    },
                    searching: function() {
                        return "搜索中…"
                    }
                }
            }),
            {
                define: e.define,
                require: e.require
            }
        })($);
        return Select2ExtModal;
    })
);
